using System;
using System.Windows.Forms;
using DevExpress.Utils;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using E4RPDevExpress10;
using E4RPTools;
using Movements.DataSet;

namespace Movements.Controls
{
    public partial class ProductXtraForm : XtraForm
    {
        private long _documentId;
        private Controller _controller;
        private ProdutoDataSet _dataSet;

        #region Properties

        public long DocumentId
        {
            set { _documentId = value; }
        }

        public Controller Controller
        {
            set { _controller = value; }
        }

        #endregion

        public ProductXtraForm()
        {
            InitializeComponent();
            Load += ProductXtraFormLoad;
            gridView.InitNewRow += GridViewInitNewRow;
            oKSimpleButton.Click += OkSimpleButtonClick;
            DevExpressHelper.SetColumnAsCurrency(colValor);
            DevExpressHelper.SetColumnAsNumericAndPaint(colStock);
        }

        private void MergeData()
        {
            _dataSet = new ProdutoDataSet();
            if (_documentId <= 0)
            {
                var product = _dataSet.Produto.NewProdutoRow();
                product.Id = _documentId;
                product.Referencia = "";
                product.Designacao = "";
                product.Unidade = "";
                product.Stock = 0;
                product.Valor = 0;
                _dataSet.Produto.AddProdutoRow(product);
            }
            else
                _dataSet.Merge(_controller.GetProduct(_documentId));
            _dataSet.EnforceConstraints = false;
        }

        private void SetupUnitProductLookupData()
        {
            unidadeProdutoDataSet = _controller.GetProductUnits();
            unitLookUpEdit.Properties.Columns.Clear();
            unitLookUpEdit.Properties.Columns.AddRange(new[] {
                    new LookUpColumnInfo("Nome", "Nome", 85, FormatType.None, "", true, HorzAlignment.Near)});
            unitLookUpEdit.Properties.DisplayMember = unidadeProdutoDataSet.UnidadeProduto.NomeColumn.ColumnName;
            unitLookUpEdit.Properties.ValueMember = unidadeProdutoDataSet.UnidadeProduto.NomeColumn.ColumnName;
            unitLookUpEdit.Properties.DataSource = unidadeProdutoDataSet.UnidadeProduto;            
        }

        private void SetupSupplierLookupData()
        {
            fornecedorDataSet = _controller.GetSuppliers();
            supplierRepositoryItemLookUpEdit.Columns.Clear();
            supplierRepositoryItemLookUpEdit.Columns.AddRange(new[] {
                new LookUpColumnInfo("Id", "Id", 81, FormatType.None, "", false, HorzAlignment.Near),
                new LookUpColumnInfo("Nome", "Nome", 85, FormatType.None, "", true, HorzAlignment.Near)});
            supplierRepositoryItemLookUpEdit.DisplayMember = fornecedorDataSet.Fornecedor.NomeColumn.ColumnName;
            supplierRepositoryItemLookUpEdit.ValueMember = fornecedorDataSet.Fornecedor.IdColumn.ColumnName;
            supplierRepositoryItemLookUpEdit.DataSource = fornecedorDataSet.Fornecedor;
            supplierRepositoryItemLookUpEdit.BestFit();
        }

        private void SetDataToControls()
        {
            referenceTextEdit.Text = _dataSet.Produto[0].Referencia;
            descriptionTextEdit.Text = _dataSet.Produto[0].Designacao;
            stockCalcEdit.EditValue = _dataSet.Produto[0].Stock;
            unitLookUpEdit.EditValue = _dataSet.Produto[0].IsUnidadeNull() ? "" : _dataSet.Produto[0].Unidade;
            valueCalcEdit.EditValue = _dataSet.Produto[0].Valor;            
            gridControl.DataSource = null;
            gridControl.DataMember = "";
            gridControl.DataSource = _dataSet;
            gridControl.DataMember = _dataSet.Fornecedor.TableName;
        }


        private void GetDataFromControls()
        {
            _dataSet.Produto[0].Referencia = referenceTextEdit.Text;
            _dataSet.Produto[0].Designacao = descriptionTextEdit.Text;
            if (unitLookUpEdit.EditValue == Convert.DBNull || unitLookUpEdit.EditValue.ToString() == "")
                _dataSet.Produto[0].SetUnidadeNull();
            else
                _dataSet.Produto[0].Unidade = unitLookUpEdit.EditValue.ToString();
            _dataSet.Produto[0].Stock = Convert.ToDecimal(stockCalcEdit.EditValue);
            _dataSet.Produto[0].Valor = Convert.ToDecimal(valueCalcEdit.EditValue);
            gridView.CloseEditor();
            gridView.UpdateCurrentRow();
        }

        private void ClearControlErrors()
        {
            dxErrorProvider.SetError(referenceTextEdit, "");
            dxErrorProvider.SetError(descriptionTextEdit, "");
            dxErrorProvider.SetError(unitLookUpEdit, "");
            dxErrorProvider.SetError(stockCalcEdit, "");
            dxErrorProvider.SetError(valueCalcEdit, "");
            dxErrorProvider.SetError(gridControl, "");
        }

        private Control GetControl(string reference)
        {
            switch (reference)
            {
                case "Referencia":
                    return referenceTextEdit;
                case "Designacao":
                    return descriptionTextEdit;
                case "Unidade":
                    return unitLookUpEdit;
                case "Stock":
                    return stockCalcEdit;
                case "Valor":
                    return valueCalcEdit;
                case "Fornecedor":
                    return gridControl;
                default:
                    return null;
            }
        }

        private void SetControlErrors(Result result)
        {
            foreach (var error in result.Errors)
                dxErrorProvider.SetError(GetControl(error.Reference), error.Message);
        }


        void ProductXtraFormLoad(object sender, EventArgs e)
        {
            MergeData();
            SetupUnitProductLookupData();
            SetupSupplierLookupData();
            SetDataToControls();
        }

        void GridViewInitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
        {
            var supplier = (ProdutoDataSet.FornecedorRow)gridView.GetDataRow(e.RowHandle);
            if (supplier == null)
                return;
            supplier.IdProduto = _dataSet.Produto[0].Id;
            supplier.Valor = 0;
            supplier.Stock = 0;
            supplier.DataActualizacao = DateTime.Now;
        }
       
        void OkSimpleButtonClick(object sender, EventArgs e)
        {
            ClearControlErrors();
            GetDataFromControls();
            var result = _controller.IsProductValid(_dataSet);
            if (result.Failed)
            {
                DialogResult = DialogResult.None;
                SetControlErrors(result);
            }
            else
                _controller.SaveProduct(_dataSet);
        }
        
    }
}